home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / ashe-1.1 / xheader.c < prev    next >
C/C++ Source or Header  |  1995-05-15  |  15KB  |  563 lines

  1. /** xheader.c - (c) 1994 Copyright by John R. Punin
  2.  *
  3.  * ASHE Editor of the HTML. 
  4.  * 
  5.  * This file has the routines to implement the options in the HTML Menu.
  6.  * 
  7.  * John R. Punin      March -12 - 1994
  8.  *
  9. */
  10. #include "xhtml.h"
  11. #include "xfile.h"
  12. #include "xheader.h"
  13. #include "xmarkup.h"
  14. #include "xviewer.h"
  15.  
  16. static char *str[6] = {
  17.    "Header 1","Header 2",
  18.    "Header 3","Header 4",
  19.    "Header 5","Header 6"};
  20.  
  21. /*
  22.    
  23.    NAME : routines_html
  24.    PARAMETERS : int item_no
  25.                 Item number of the menu HTML
  26.    RETURN : void
  27.    DESCRIPTION :This is a Callback function that is called when
  28.                 one of the items of the HTML menu is selected.
  29.  
  30. */
  31. void
  32. routines_html(Widget w,int item_no, XtPointer call_data)
  33. {
  34.    Widget parent = XtParent(w);
  35.    HTMLED *he;
  36.  
  37.    XtVaGetValues(parent,XmNuserData,&he,NULL);
  38.    if(item_no==0)
  39.       create_title(w,(XtPointer)he);
  40.    else if(item_no==1)
  41.       create_header(w,he);
  42.    else if(item_no==2)
  43.       create_paragraph(w,he);
  44.    else if(item_no==3)
  45.       create_line_break(w,he);
  46.    else if(item_no==4)
  47.       create_hor_rule(w,he);
  48.    else if(item_no==5)
  49.       create_pre(w,he);
  50.    else if(item_no==6)
  51.       create_pre(w,he);
  52.    else if(item_no==7)
  53.       create_linker(w,he);
  54.    else if(item_no==8)
  55.       create_reference(w,he);
  56.    else if(item_no==9)
  57.       create_figure(w,he);  
  58. }
  59. /*
  60.    
  61.    NAME : create_title
  62.    PARAMETERS : Widget w
  63.                 From what widget this function is called.
  64.    RETURN : void
  65.    DESCRIPTION : This function creates the dialog widget title 
  66.                  to enter the name of the title of the HTML Document
  67.  
  68. */
  69.  
  70. void
  71. create_title(Widget w,XtPointer client_data)
  72. {
  73.    HTMLED *he = (HTMLED *)client_data; 
  74.    Display *display = XtDisplay(he->textarea);
  75.    Widget dialog;
  76.    XmString st,t = XmStringCreateSimple("Title Name :");
  77.    XmString clear =XmStringCreateSimple("Clear"); 
  78.    Arg args[5];
  79.    char *selection_title=NULL ;
  80.  
  81.    /* Create the dialog for Title in the HTML Document *
  82.     * The textarea is the parent of the Dialog Shell   *
  83.     * The "userData" is used to store the value string */
  84.    
  85.    XtSetArg(args[0], XmNselectionLabelString, t); 
  86.    XtSetArg(args[1], XmNuserData,0); 
  87.    XtSetArg(args[2],XmNapplyLabelString,clear);
  88.    dialog = XmCreatePromptDialog(he->textarea,"Title",args,3);
  89.    if(selection_title=XmTextGetSelection(he->textarea)) 
  90.    {
  91.       st = XmStringCreateLtoR(selection_title,XmSTRING_DEFAULT_CHARSET);
  92.       XtVaSetValues(dialog, 
  93.             XmNtextString,st, 
  94.             NULL);
  95.       XmStringFree(st);
  96.       XtFree(selection_title);
  97.    }
  98.    XmStringFree(t);
  99.  
  100.    /* When the user types the title name, call title_name()... */
  101.    XtAddCallback(dialog, XmNokCallback, (XtCallbackProc)title_name,(XtPointer)he);
  102.    
  103.    /* If the user selects cancel, just destroy the dialog */
  104.    XtAddCallback(dialog,XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  105.    /* Clear button is available */
  106.    XtAddCallback(dialog,XmNapplyCallback,(XtCallbackProc)clear_title,NULL);
  107.    XtManageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_APPLY_BUTTON));
  108.    
  109.    /* No help is available */
  110.    XtUnmanageChild(XmSelectionBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
  111.    
  112.    XtManageChild(dialog);
  113.    XWarpPointer(display,XtWindow(he->textarea),
  114.         XtWindow(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT)),
  115.                    0,0,800,800,0,0);
  116.  
  117. }
  118.  
  119. /*
  120.    
  121.    NAME : title_name
  122.    PARAMETERS : Widget w
  123.                 From what widget this function is called.
  124.    RETURN : void
  125.    DESCRIPTION : This is a Callback function and sets the
  126.                  title of the HTML document when the Ok button
  127.          is selected from the dialog widget.
  128.  
  129. */
  130. void 
  131. title_name( Widget w, 
  132.        XtPointer client_data, 
  133.        XmSelectionBoxCallbackStruct *cbs)
  134. {
  135.    HTMLED *he = (HTMLED *)client_data;
  136.    XmTextPosition left,right;
  137.    char *text_title=NULL;
  138.    char *value=NULL;
  139.    char *str=NULL,*title=NULL;
  140.    int len;
  141.    he->last_command = TITLE;
  142.  
  143.    if(XmStringGetLtoR(cbs->value,XmSTRING_DEFAULT_CHARSET,&value))
  144.       len = strlen(value);
  145.    text_title= XtMalloc(len+20);
  146.    title = remove_title(&left,&right,he);
  147.    strcpy(text_title,"<TITLE>");
  148.    if(value != NULL) 
  149.    {
  150.       strcat(text_title,value);
  151.       Set_label(he->title_output,value);
  152.    }
  153.    strcat(text_title,"</TITLE>");
  154.    if(left!=0)
  155.    {
  156.       XmTextSetSelection(he->textarea,right-7,left,cbs->event->xbutton.time);
  157.       str = XmTextGetSelection(he->textarea);
  158.       if((str)&&(strlen(str)<(BUFSIZE - 10)))
  159.      strcpy(he->undo_buffer.ubuffer,str);
  160.       else
  161.      printf("Error :No title was selected\n");
  162.       XtFree(str);
  163.       XmTextReplace(he->textarea,right-7,left,text_title);
  164.       left = right-7; /* BKi */
  165.    }
  166.    else
  167.    {
  168.       left = XmTextGetInsertionPosition(he->textarea);
  169.       XmTextInsert(he->textarea,left,text_title);
  170.    }
  171.  
  172.    if(len==0)
  173.       XmTextSetInsertionPosition(he->textarea,left+7); 
  174.    else
  175.       XmTextSetInsertionPosition(he->textarea,left+len+15); 
  176.  
  177.    XtFree(text_title);
  178.    XtFree(title);
  179. }
  180. /*
  181.    
  182.    NAME : remove_title
  183.    PARAMETERS : XmTextPosition *left,
  184.                 XmTextPosition *right
  185.         Positions where the old title and returns the new
  186.         position of the new title
  187.    RETURN : char *title
  188.             Returns the title of the Document
  189.    DESCRIPTION : This function removes the old title and replace it
  190.                  with the new title
  191.  
  192. */
  193. char *
  194. remove_title(XmTextPosition *left,XmTextPosition *right,HTMLED *he)
  195. {
  196.    int i;
  197.    int flag=0;
  198.    int title_found=0;
  199.    char *text = XmTextGetString(he->textarea);
  200.    char *title=NULL;
  201.    *left = *right = 0;
  202.  
  203.    for(i=0;i<strlen(text);i++)
  204.    {
  205.       if(flag)
  206.      break;
  207.       if(!title_found)
  208.       {
  209.      if(!strncasecmp(&(text[i]),"<TITLE>",7))
  210.      {
  211.         *right = i+7;
  212.         title_found=1;
  213.         flag=0;
  214.      }
  215.       }
  216.       else
  217.      if(!strncasecmp(&(text[i]),"</TITLE>",8))
  218.      {
  219.         *left=i+8;
  220.         flag=1;
  221.      }
  222.    }
  223.  
  224.    if(!(flag&&title_found))
  225.    {
  226.       *left = 0;
  227.       *right = 0;
  228.    }
  229.    if(*left != 0)
  230.    {
  231.       title = XtMalloc((int)(*left-*right+5));
  232.       strncpy(title,&(text[*right]),*left-*right-8);
  233.       title[*left-*right-8]='\0';
  234.    }
  235.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  236.    XtFree(text);
  237.    return(title);
  238. }
  239.  
  240. void 
  241. clear_title(
  242.    Widget  w,
  243.    XtPointer client_data,XtPointer call_data)
  244. {
  245.    XmString s = XmStringCreateSimple("");
  246.    XtVaSetValues(w, XmNtextString, s, NULL);
  247. }
  248. /*
  249.    
  250.    NAME : create_paragraph
  251.    PARAMETERS : Widget w
  252.                 From what widget this function is called.
  253.    RETURN : void
  254.    DESCRIPTION : This is a Callback function and sets the
  255.                  tag paragraph where the cursor is.
  256.  
  257. */
  258.  
  259. void 
  260. create_paragraph(Widget w,HTMLED *he)
  261. {
  262.    XmTextPosition pos;  
  263.    pos = XmTextGetInsertionPosition(he->textarea);
  264.    he->last_command = PARAG;
  265.    XmTextInsert(he->textarea,pos,"<P>\n");
  266.    XmTextSetInsertionPosition(he->textarea,pos + 4); 
  267.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  268. }
  269. /*
  270.    
  271.    NAME : create_line_break
  272.    PARAMETERS : Widget w
  273.                 From what widget this function is called.
  274.    RETURN : void
  275.    DESCRIPTION : This is a Callback function and sets the
  276.                  tag line break where the cursor is.
  277.  
  278. */
  279.  
  280. void 
  281. create_line_break(Widget w,HTMLED *he)
  282. {
  283.    XmTextPosition pos;  
  284.    pos = XmTextGetInsertionPosition(he->textarea);
  285.    he->last_command = LINEBREAK;
  286.    XmTextInsert(he->textarea,pos,"<BR>\n");
  287.    XmTextSetInsertionPosition(he->textarea,pos + 5); 
  288.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  289. }
  290. /*
  291.    
  292.    NAME : create_hor_rule
  293.    PARAMETERS : Widget w
  294.                 From what widget this function is called.
  295.    RETURN : void
  296.    DESCRIPTION : This is a Callback function and sets the
  297.                  tag horizontal rule where the cursor is.
  298.  
  299. */
  300.  
  301. void 
  302. create_hor_rule(Widget w,HTMLED *he)
  303. {
  304.    XmTextPosition pos;  
  305.    pos = XmTextGetInsertionPosition(he->textarea);
  306.    he->last_command = HR;
  307.    XmTextInsert(he->textarea,pos,"<HR>\n");
  308.    XmTextSetInsertionPosition(he->textarea,pos + 5); 
  309.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);
  310. }
  311. /*
  312.    
  313.    NAME : create_header
  314.    PARAMETERS : Widget w
  315.                 From what widget this function is called.
  316.    RETURN : void
  317.    DESCRIPTION : This function creates the  dialog widget to
  318.                  select a Header between 1-6 and show the
  319.          selected text as a Header.
  320.  
  321. */
  322. void 
  323. create_header(Widget w,HTMLED *he)
  324. {
  325.    Widget dialog,radiobox;
  326.    XmString t = XmStringCreateLtoR("Header is : \n",XmSTRING_DEFAULT_CHARSET);
  327.    char *mstr;
  328.    XmString mstring,u,strtable[6];
  329.    int i;
  330.  
  331.    dialog = XmCreatePromptDialog(he->textarea,"notice_header",NULL,0);
  332.    
  333.    mstr = XmTextGetSelection(he->textarea);
  334.    if(mstr)
  335.    {
  336.       mstring = XmStringCreateLtoR(mstr,XmSTRING_DEFAULT_CHARSET);
  337.       u = XmStringConcat(t,mstring);
  338.       XmStringFree(mstring); 
  339.    }
  340.    else
  341.       u = XmStringCopy(t);
  342.  
  343.    XmStringFree(t);
  344.    XtVaSetValues(dialog,
  345.          XmNselectionLabelString,u,NULL);
  346.    XmStringFree(u);
  347.    /* When the user choose a size of the header, call set_header */
  348.    XtAddCallback(dialog, XmNokCallback,(XtCallbackProc)set_header,(XtPointer)he);
  349.    
  350.    /* If the user selects cancel, just destroy the header dialog */
  351.    XtAddCallback(dialog, XmNcancelCallback,(XtCallbackProc)XtDestroyWidget,NULL);
  352.    
  353.    /* Nor help neither text is available.... */
  354.    XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_HELP_BUTTON));
  355.    XtUnmanageChild(XmSelectionBoxGetChild(dialog,XmDIALOG_TEXT));
  356.    
  357.    /* Create a radio box -- callback routine is toggled()  */
  358.    for(i=0;i<6;i++)
  359.       strtable[i]=XmStringCreateSimple(str[i]);
  360.    radiobox = 
  361.       XmVaCreateSimpleRadioBox(dialog,"radiob",
  362.                    0, /* the initial choice */
  363.                    toggled, /* the callback routine */
  364.                    XmVaRADIOBUTTON,strtable[0],NULL,NULL,NULL,
  365.                    XmVaRADIOBUTTON,strtable[1],NULL,NULL,NULL,
  366.                    XmVaRADIOBUTTON,strtable[2],NULL,NULL,NULL,
  367.                    XmVaRADIOBUTTON,strtable[3],NULL,NULL,NULL,
  368.                    XmVaRADIOBUTTON,strtable[4],NULL,NULL,NULL,
  369.                    XmVaRADIOBUTTON,strtable[5],NULL,NULL,NULL,
  370.                    XmNuserData,he,
  371.                    NULL);
  372.  
  373.    XtManageChild(radiobox);
  374.  
  375.    for(i=0;i<6;i++)
  376.       XmStringFree(strtable[i]);
  377.  
  378.    XtManageChild(dialog);
  379.    XWarpPointer(XtDisplay(he->textarea),XtWindow(he->textarea),
  380.         XtWindow(dialog),0,0,800,800,20,20);
  381. }
  382. /*
  383.    
  384.    NAME : set_header
  385.    PARAMETERS : Widget w
  386.                 From what widget this function is called.
  387.    RETURN : void
  388.    DESCRIPTION : This is a Callback function and sets the
  389.                  Header tags to the selected text.
  390. */
  391. void 
  392. set_header(Widget w,XtPointer client_data)
  393. {
  394.    
  395.    HTMLED *he = (HTMLED *)client_data;
  396.    XmTextPosition left,right;
  397.    char *sel=NULL;
  398.    char str[20];
  399.    int len = 0;
  400.    int header_num = he->header_num;
  401.    he->last_command = HEADER;
  402.    if(XmTextGetSelectionPosition(he->textarea,&left,&right))
  403.    {
  404.       sel = XmTextGetSelection(he->textarea);
  405.       if(sel) len = strlen(sel);
  406.    }
  407.  
  408.    if(len)
  409.    {
  410.       sprintf(str,"</H%d>\n",header_num+1);
  411.       XmTextInsert(he->textarea,right,str);
  412.       sprintf(str,"<H%d>",header_num+1);
  413.       XmTextInsert(he->textarea,left,str);
  414.       XmTextSetInsertionPosition(he->textarea,left+len+10); 
  415.    }
  416.    else
  417.    {
  418.       left = XmTextGetInsertionPosition(he->textarea);
  419.       sprintf(str,"<H%d></H%d>\n",header_num+1,header_num+1);
  420.       XmTextInsert(he->textarea,left,str);
  421.       XmTextSetInsertionPosition(he->textarea,left+4); 
  422.    }
  423.    XtFree(sel);
  424.    he->header_num = 0;
  425.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT); 
  426. }   
  427. /*
  428.    
  429.    NAME : toggled
  430.    PARAMETERS : XmToggleButtonCallbackStruct *state
  431.                 Shows which radio button changed the state
  432.    RETURN : void
  433.    DESCRIPTION : This is a Callback function and sets the
  434.                  Header number of the selected text
  435.  
  436. */
  437. void
  438. toggled(
  439.     Widget w,
  440.     XtPointer client_data, XtPointer call_data)
  441. {
  442.    XmToggleButtonCallbackStruct *state = 
  443.       (XmToggleButtonCallbackStruct *)call_data;
  444.    int which = (int)client_data;
  445.    HTMLED *he;
  446.    XtVaGetValues(XtParent(w),XmNuserData,&he,NULL);
  447.    if(state->set)
  448.       he->header_num = which;
  449.    else
  450.       he->header_num = 0;
  451.  
  452. }
  453. /*
  454.    
  455.    NAME : create_undo
  456.    PARAMETERS : Widget w
  457.                 From what widget this function is called.
  458.    RETURN : void
  459.    DESCRIPTION : This is a Callback function and retrieves
  460.                  the value that was saved in the structure
  461.          undo_buffer to undo the last command
  462.  
  463. */
  464.  
  465. void
  466. create_undo(Widget w,HTMLED *he)
  467. {
  468.    undo_struct *undo_buffer = &(he->undo_buffer);
  469.   
  470.    if(he->last_command == CLEAR)
  471.    {
  472.       char *title;
  473.       XmTextSetString(he->textarea, he->text_cleared);
  474.       HTMLSetText(he->html_text,he->text_cleared,NULL,NULL,0,NULL,NULL);
  475.       title = get_title(he->html_text);
  476.       if(title!=NULL)
  477.      Set_label(he->title_output,title);
  478.       else
  479.      Set_label(he->title_output,"");
  480.       XtFree(he->text_cleared);
  481.       he->text_cleared = NULL;
  482.       he->last_command = NONE;
  483.       XtFree(title);
  484.       return;
  485.    }
  486.    if(he->last_command == TITLE)
  487.    {
  488.       XmTextReplace(he->textarea,undo_buffer->left,
  489.           undo_buffer->left+undo_buffer->lenleft,undo_buffer->ubuffer);
  490.       undo_buffer->lenright = 0;
  491.       he->last_command = NONE;
  492.       undo_buffer->lenleft = 0;
  493.       undo_buffer->ubuffer[0]='\0';
  494.       return;
  495.    }
  496.    if(he->last_command != NONE)
  497.    {
  498.       XmTextReplace(he->textarea,undo_buffer->left,
  499.             undo_buffer->left+undo_buffer->lenleft,"");
  500.       if((he->last_command!=PARAG)&&
  501.      (he->last_command!=LINEBREAK)&&
  502.      (he->last_command!=IMAGE)&&
  503.      (he->last_command!=INPUT)&&
  504.      (he->last_command!=OPTION)&&
  505.      (he->last_command!=HR)&&
  506.      (he->last_command!=ITEM)&&
  507.      (he->last_command!=TERM)&&
  508.      (he->last_command!=DEFLIST)&&
  509.      (he->last_command!=CARAC))
  510.      XmTextReplace(he->textarea,undo_buffer->right,
  511.                undo_buffer->right+undo_buffer->lenright,"");
  512.    }
  513.    undo_buffer->lenright = 0;
  514.    he->last_command = NONE;
  515.    undo_buffer->lenleft = 0;
  516.    XmProcessTraversal(he->textarea,XmTRAVERSE_CURRENT);    
  517. }
  518. /*
  519.    
  520.    NAME : verify_text
  521.    PARAMETERS : XmTextVerifyCallbackStruct *cbs
  522.                 This pointer give you the value of the string
  523.         to be inserted in the text widget and also
  524.         give the current position of the cursor
  525.    RETURN : void
  526.    DESCRIPTION : This is a Callback function and verifyes
  527.                  what kind of information is inserted in the
  528.          text widget with the purpose to save them in
  529.          in the undo_buffer and set the underlining of
  530.          the tags.
  531.  
  532. */
  533. void 
  534. verify_text(
  535.         Widget tx, 
  536.         XtPointer client_data, 
  537.         XmTextVerifyCallbackStruct *cbs)
  538. {
  539.    HTMLED *he = (HTMLED *)client_data;
  540.    undo_struct *undo_buffer = &(he->undo_buffer);
  541.    char *t;
  542.    he->modified_file=TRUE;/* File is modified */
  543.    if((he->text_cleared)&&(he->last_command != CLEAR))
  544.    {
  545.       XtFree(he->text_cleared);
  546.       he->text_cleared = NULL;
  547.    }
  548.    if(cbs->text->ptr == NULL)/* backspace */
  549.       return;
  550.    undo_buffer->right = undo_buffer->left;
  551.    undo_buffer->lenright = undo_buffer->lenleft;
  552.    undo_buffer->lenleft = cbs->text->length;
  553.    undo_buffer->left = cbs->startPos;
  554.    undo_buffer->com_html = he->last_command;
  555.    if(he->toggle_mark_tag==True)
  556.    {
  557.       t = XmTextGetString(he->textarea);
  558.       parsing_hightlight(t,cbs->startPos,cbs->text->length,he);
  559.       XtFree(t);
  560.    }
  561. }
  562.  
  563.